<?php
/**
 * Created by PhpStorm.
 * User: xiao
 * Date: 2018/3/19
 * Time: 14:05
 */

namespace Org\Baidu;


class RsaPublicEncrypt
{
    /**
     * @var string
     */
    private $publicKey;

    /**
     * @var string
     */
    private $path;

    /**
     * construct
     * @param string $path
     */
    public function __construct($path)
    {
        if (empty($path) || !is_dir($path)) {
            echo "[error] error public key path: {$path}" . PHP_EOL;
        }
        $this->path = $path;
    }

    /**
     * setup public key
     * @return boolean
     */
    public function setupPublicKey()
    {
        if (is_resource($this->publicKey)) {
            return true;
        }
        $file = $this->path . DIRECTORY_SEPARATOR . 'api_pub.key';
        $puk = file_get_contents($file);
        $this->publicKey = openssl_pkey_get_public($puk);
        return true;
    }

    /**
     * pub encrypt
     * @param string $data
     * @return string
     */
    public function pubEncrypt($data)
    {
        if (!is_string($data)) {
            return null;
        }
        $this->setupPublicKey();
        $ret = openssl_public_encrypt($data, $encrypted, $this->publicKey);
        if ($ret) {
            return $encrypted;
        } else {
            return null;
        }
    }

    /**
     * destruct
     */
    public function __destruct()
    {
        @fclose($this->publicKey);
    }


    /**
     * gzdecode
     * @param string $data
     * @return string
     */
    public static function gzdecode($data)
    {
        $flags = ord(substr($data, 3, 1));
        $headerlen = 10;
        $extralen = 0;
        $filenamelen = 0;
        if ($flags & 4) {
            $extralen = unpack('v', substr($data, 10, 2));
            $extralen = $extralen[1];
            $headerlen += 2 + $extralen;
        }
        if ($flags & 8) {
            $headerlen = strpos($data, chr(0), $headerlen) + 1;
        }
        if ($flags & 16) {
            $headerlen = strpos($data, chr(0), $headerlen) + 1;
        }
        if ($flags & 2) {
            $headerlen += 2;
        }
        $unpacked = @gzinflate(substr($data, $headerlen));
        if ($unpacked === false) {
            $unpacked = $data;
        }
        return $unpacked;
    }

}

